<template>
  <div class="box">
    <h2>子组件 add</h2>
    从vuex中获取的值:<label>{{ $store.state.count }}</label>
    <br />
    <button @click="add">值+1</button>
    <button @click="add10">值+10</button>
    <button @click="async20">一秒后值+20</button>
    <ul>
      <!-- <li v-for="item in $store.getters.showList" :key="item"> -->
      <li v-for="item in showList" :key="item">
        {{ item }}
      </li>
    </ul>
  </div>
</template>

<script>
// 1. 导入
import { mapMutations,mapActions ,mapGetters } from 'vuex'
export default {
  name: 'AddItem',
  methods: {
    // 2. 在 methods 中调用并展开结果
    ...mapMutations(['addNum']),
    ...mapActions(['asyncAdd']),
    add() {
      // Vue 官方强烈谴责! 不允许这么干! 强烈不建议
      // 因为这样修改会导致溯源很困难, 将来所有组件都这样修改 state 的数据, 后期项目调试会非常麻烦
      // this.$store.state.count++
      this.$store.commit('addCount')
    },
    add10() {
      // this.$store.commit('addNum', 10)
      this.addNum(10)
    },
    async20(){
      // 不要去触发异步的 mutations
      // this.$store.commit('asyncAdd', 20)
      // 调用 actions 的方法
      // this.$store.dispatch('add1S20',20)
      this.asyncAdd(20)
    }
  },
  computed:{
  ...mapGetters(['showList'])
  }
// 不用自己定义计算属性, 如果多个组件都要用, 每次都得复制, 太麻烦了, 应该使用 getters
  // computed: {
  //   showList() {
  //     return this.$store.state.list.filter(item => item > 5)
  //   }
  // }
}
</script>

<style lang="css" scoped>
.box {
  border: 3px solid #ccc;
  width: 400px;
  padding: 10px;
  margin: 20px;
}
h2 {
  margin-top: 10px;
}
</style>